require 'digest/sha1'
require 'digest/sha2'
class UsersController < ApplicationController
  before_filter :authenticate_member, :except => ['login', 'new','confirm_account', 'create','resend_confirmation_link', 'send_ip_confirmation_link', 'confirm_ip']
  before_filter :authenticate_admin, :except => ['login', 'logout', 'new', 'confirm_account', 'create', 'resend_confirmation_link', 'send_ip_confirmation_link', 'confirm_ip']
  
  # GET /users
  # GET /users.xml
  def index
    @users = User.find(:all)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @users }
    end
  end

    def login
    if params[:user] && params[:user][:email] && params[:user][:pwd]
      user = User.find_by_email(params[:user][:email].downcase)
      if user
        if user.pwd == Digest::SHA2.hexdigest('zwx'+params[:user][:pwd]+'rev')
          if user.rights >= CONFIRMED_USER
            if (user.ip == Digest::SHA2.hexdigest('zwx'+request.remote_ip+'rev'))
              session[:user]=user
            elsif(user.rights >= CONFIRMED_USER_IP_FREE)
              user.ip = request.remote_ip
              user.save
              session[:user] = user
            else
              flash[:notice] ='Vous avez changé d\'ip. Pour utiliser votre compte avec votre nouvelle IP, <a href="'+url_for( :controller => :users, :action => :send_ip_confirmation_link, :id => user.id)+'">cliquez ici</a> pour recevoir un e-mail de confirmation'
            end
          else
            flash[:notice] = 'Votre compte n\'est pas activé! Veuillez cliquer sur le lien qui vous a été envoyé par eMail lors de votre inscription. Pour recevoir un nouvel eMail de confirmation, <a href="'+url_for(:action => 'resend_confirmation_link',:controller => 'users', :id => user.id)+'">cliquez ici</a>'
          end
        else
          flash[:notice] = 'Mauvais mot de passe!'
        end
      else
        flash[:notice] = "Votre e-mail est inconnu!"
      end
    else
      flash[:notice]= "Veuillez entrer votre e-mail et mot de passe !"
    end
    redirect_to '/'
  end

  def logout
    session[:user]=nil
    reset_session
    redirect_to '/'
  end

    def resend_confirmation_link
    if params[:id]
      if user = User.find(params[:id])
        if user.rights == UNCONFIRMED_USER
          key=Digest::SHA1.hexdigest(user.email+SECRET_HASH_KEY).to_s
          flash[:notice] = "Un email vous a été envoyé!"
          Notifier.deliver_confirmation_inscription(user,key)
        else
          flash[:notice] = "Impossible d'effectuer l'activation pour cet email!"
        end
      else
        flash[:notice] = "Impossible d'effectuer l'action pour cet email!"
      end
    else
      flash[:notice] = "L'email n'a pas été indiqué!"
    end
    redirect_to '/'
  end

    def send_ip_confirmation_link
    if params[:id]
      if user = User.find(params[:id])
        if user.rights >= CONFIRMED_USER
          key=Digest::SHA1.hexdigest(request.remote_ip+SECRET_HASH_KEY).to_s
          flash[:notice] = "Un email vous a été envoyé!"
          Notifier.deliver_change_ip(user,key)
        else
          flash[:notice] = "Impossible de changer l'ip d'un compte non activé!"
        end
      else
        flash[:notice] = "Impossible d'effectuer l'action pour ce compte!"
      end
    else
      flash[:notice] = "L'email n'a pas été indiqué!"
    end
    redirect_to '/'
  end

  # GET /users/1
  # GET /users/1.xml
  def show
    @user = User.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @user }
    end
  end

  # GET /users/new
  # GET /users/new.xml
  def new
    @user = User.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @user }
    end
  end

  # GET /users/1/edit
  def edit
    @user = User.find(params[:id])
    @user.pwd = ''
  end

    def confirm_account
    if (user = User.find_by_email(params[:email]))
      if params[:id] == Digest::SHA1.hexdigest(user.email+SECRET_HASH_KEY).to_s
        user.enable_account
        if user.save
          flash[:notice] = "#{user.nickname}, votre compte a bien été activé! Vous pouvez vous logger grâce au formulaire ci contre à gauche."
        else
          flash[:notice] = "Une erreur est survenue, votre compte n'a pu être activé."
        end
      else
        flash[:notice] = "La clé est invalide. Votre compte n'a pas été activé!"
      end
    else
      flash[:notice] = "Une erreur est survenue, votre email n'a pas été trouvé, votre compte n'a donc pas été activé."
    end
    redirect_to('/')
  end

  def confirm_ip
    if (user = User.find_by_email(params[:email]))
      if (ip = request.remote_ip)
        if params[:id] == Digest::SHA1.hexdigest(ip+SECRET_HASH_KEY).to_s
          user.ip = ip
          if user.save
            flash[:notice] = "#{user.nickname}, votre nouvelle IP a bien été activée! Vous pouvez vous logger grâce au formulaire pas loin."
          else
            flash[:notice] = "Une erreur est survenue, votre nouvelle IP n'a pu être activée."
          end
        else
          flash[:notice] = "La clé est invalide. Votre nouvelle IP n'a pas été activée!"
        end
      else
        flash[:notice] = "Une erreur est survenue, votre nouvelle IP n'a pas été trouvée, et n'a donc pas été activée."
     end
    else
      flash[:notice] = "Une erreur est survenue, votre email n'a pas été trouvé, votre nouvelle IP n'a donc pas été activée."
    end
    redirect_to('/')
  end


  # POST /users
  # POST /users.xml
  def create
    @user = User.new(params[:user])
    @user.pwd =  Digest::SHA2.hexdigest('zwx'+@user.pwd+'rev')
    @user.pwd_confirmation =  Digest::SHA2.hexdigest('zwx'+@user.pwd_confirmation+'rev')
    @user.email = @user.email.downcase
    @user.rights = UNCONFIRMED_USER
    @user.ip = request.remote_ip
    respond_to do |format|
      if @user.save
        flash[:notice] = "L'utilisateur a bien été créé!"
        reg_key = Digest::SHA1.hexdigest(@user.email+SECRET_HASH_KEY).to_s
        Notifier.deliver_confirmation_inscription(@user,reg_key)
        @user.pwd = ''
        format.html
        format.xml  { render :xml => @user, :status => :created, :location => @user }
      else
        @user.pwd = @user.pwd_confirmation = ''
        format.html { render :action => "new" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /users/1
  # PUT /users/1.xml
  def update
    @user = User.find(params[:id])
    if params[:user][:pwd].empty? # si on ne change pas de mot de passe
      params[:user][:pwd] = params[:user][:pwd_confirmation] = @user.pwd # on recupere l'ancien
    else # sinon on hash les deux avant validations
      params[:user][:pwd] = Digest::SHA2.hexdigest('zwx'+params[:user][:pwd]+'rev')
      params[:user][:pwd_confirmation] = Digest::SHA2.hexdigest('zwx'+params[:user][:pwd_confirmation]+'rev')
    end
    respond_to do |format|
      if @user.update_attributes(params[:user])
        flash[:notice] = 'User was successfully updated.'
        format.html { redirect_to(@user) }
        format.xml  { head :ok }
      else
        @user.pwd = @user.pwd_confirmation = ''
        format.html { render :action => "edit" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

  # DELETE /users/1
  # DELETE /users/1.xml
  def destroy
    @user = User.find(params[:id])
    @user.destroy

    respond_to do |format|
      format.html { redirect_to(users_url) }
      format.xml  { head :ok }
    end
  end
end
